/**
 * 
 */
package model;

import java.util.ArrayList;

import model.container.Cursussen;
import persistenty.TekstPersisteerbaar;

/**
 * Deze class staat in voor het aanmaken van een nieuw Cursus object
 * 
 * @author Yves Vandeput
 * @author Nicolas Vanderhulst
 * @version 20111009
 */
public class Cursus implements Comparable<Cursus>, Cloneable, TekstPersisteerbaar {

	// declareren van variabelen
	private int cursusCode;
	private String cursusNaam;
	private int lestijdPerWeek;
	private int studiePunten;
	private Opleiding opleiding;
	public ArrayList<Cursus> voorgaandeCursussen = new ArrayList<Cursus>();

	// Getters and Setters
	public int getCursusCode() {
		return cursusCode;
	}

	public void setCursusCode(int cursusCode) {
		this.cursusCode = cursusCode;
	}

	public String getCursusNaam() {
		return cursusNaam;
	}

	public void setCursusNaam(String cursusNaam) {
		this.cursusNaam = cursusNaam;
	}

	public int getLestijdPerWeek() {
		return lestijdPerWeek;
	}

	public void setLestijdPerWeek(int lPerWeek) throws IllegalArgumentException {
		switch (lPerWeek) {
		case 120: {
			this.lestijdPerWeek = lPerWeek;
			break;
		}
		case 240: {
			this.lestijdPerWeek = lPerWeek;
			break;
		}
		default: {
			throw new IllegalArgumentException("Foutieve lestijd ingevoerd! Maak uw keuze tussen 120 of 240 uur");
		}
		}
	}

	public int getStudiePunten() {
		return studiePunten;
	}

	public void setStudiePunten(int sPunten) throws IllegalArgumentException {
		switch (sPunten) {
		case 3: {
			this.studiePunten = sPunten;
			break;
		}
		case 6: {
			this.studiePunten = sPunten;
			break;
		}
		default: {
			throw new IllegalArgumentException("Foutieve studiepunten ingevoerd! Maak uw keuze tussen 3 of 6 punten!");
		}
		}
	}

	public Opleiding getOpleiding() {
		return opleiding;
	}

	public void setOpleiding(Opleiding opleiding) {
		this.opleiding = opleiding;
	}

	// Default Constructor
	public Cursus() {

	}

	// Constructor zonder voorgaande opleidingen
	public Cursus(int cursuscode, String cursusnaam, int studiepunten, int lestijdperweek, Opleiding opleiding)
			throws IllegalArgumentException {
		this.setCursusCode(cursuscode);
		this.setCursusNaam(cursusnaam);
		this.setStudiePunten(studiepunten);
		this.setLestijdPerWeek(lestijdperweek);
		this.setOpleiding(opleiding);
	}

	// Constructor met voorgaande opleidingen
	public Cursus(int cursuscode, String cursusnaam, int studiepunten, int lestijdperweek, Opleiding opleiding,
			ArrayList<Cursus> vorigeCursussen) throws IllegalArgumentException {
		this.setCursusCode(cursuscode);
		this.setCursusNaam(cursusnaam);
		this.setStudiePunten(studiepunten);
		this.setLestijdPerWeek(lestijdperweek);
		this.setOpleiding(opleiding);
		this.voorgaandeCursussen = vorigeCursussen;
	}

	@Override
	public int hashCode() {
		final int prime = 31;
		int result = 1;
		result = prime * result + cursusCode;
		result = prime * result + ((cursusNaam == null) ? 0 : cursusNaam.hashCode());
		result = prime * result + lestijdPerWeek;
		result = prime * result + ((opleiding == null) ? 0 : opleiding.hashCode());
		result = prime * result + studiePunten;
		result = prime * result + ((voorgaandeCursussen == null) ? 0 : voorgaandeCursussen.hashCode());
		return result;
	}

	@Override
	public boolean equals(Object obj) {
		if (this == obj) {
			return true;
		}
		if (obj == null) {
			return false;
		}
		if (getClass() != obj.getClass()) {
			return false;
		}
		Cursus other = (Cursus) obj;
		if (cursusCode != other.cursusCode) {
			return false;
		}
		if (cursusNaam == null) {
			if (other.cursusNaam != null) {
				return false;
			}
		} else if (!cursusNaam.equals(other.cursusNaam)) {
			return false;
		}
		if (lestijdPerWeek != other.lestijdPerWeek) {
			return false;
		}
		if (opleiding != other.opleiding) {
			return false;
		}
		if (studiePunten != other.studiePunten) {
			return false;
		}
		if (voorgaandeCursussen == null) {
			if (other.voorgaandeCursussen != null) {
				return false;
			}
		} else if (!voorgaandeCursussen.equals(other.voorgaandeCursussen)) {
			return false;
		}
		return true;
	}

	/*
	 * (non-Javadoc)
	 * 
	 * @see java.lang.Object#toString()
	 */
	@Override
	public String toString() {
		return "Cursus [cursusCode= " + cursusCode + ", cursusNaam= " + cursusNaam + ", lestijdPerWeek= "
				+ lestijdPerWeek + ", studiePunten= " + studiePunten + ", opleiding= " + opleiding
				+ ", voorgaandeCursussen= " + voorgaandeCursussen + "]";
	}

	/**
	 * @return Cursus
	 */
	@Override
	public Cursus clone() {
		Cursus tempCursus = new Cursus();
		tempCursus.setID(this.getID());
		tempCursus.setCursusCode(this.cursusCode);
		tempCursus.setCursusNaam(this.cursusNaam);
		tempCursus.setLestijdPerWeek(this.lestijdPerWeek);
		tempCursus.setStudiePunten(this.studiePunten);
		tempCursus.setOpleiding(this.opleiding);
		tempCursus.voorgaandeCursussen = this.voorgaandeCursussen;
		return tempCursus;
	}

	@Override
	public int compareTo(Cursus o) {
		Cursus c = o;
		if (c.cursusCode < o.cursusCode) {
			return -1;
		} else if (c.cursusCode > o.cursusCode) {
			return 1;
		} else {
			if (c.cursusNaam.hashCode() < o.cursusNaam.hashCode()) {
				return -1;
			} else if (c.cursusNaam.hashCode() > o.cursusNaam.hashCode()) {
				return 1;
			} else {
				return 0;
			}
		}
	}

	@Override
	public void setID(int id) {
		cursusCode = id > 0 ? id : cursusCode;

	}

	@Override
	public int getID() {

		return cursusCode;
	}

	@SuppressWarnings("boxing")
	@Override
	public String maakTekstVanObject() {
		StringBuffer cursusLijst = new StringBuffer();
		if (this.voorgaandeCursussen != null) {
			for (Cursus c : this.voorgaandeCursussen) {
				cursusLijst.append(c.cursusCode + " ");
			}
		}
		return String.format("%s\t%s\t%s\t%s\t%s\t%s\n", this.getCursusCode(), this.getCursusNaam(),
				this.getLestijdPerWeek(), this.getStudiePunten(), this.getOpleiding().toString(),
				cursusLijst.toString());
	}

	@Override
	public Cursus maakObjectVanTekst(String input) {
		Cursus tempCursus = new Cursus();
		String[] tokens = input.split("\t");
		// Opvullen variabelen
		tempCursus.setID(Integer.parseInt(tokens[0]));
		tempCursus.setCursusCode(Integer.parseInt(tokens[0]));
		tempCursus.setCursusNaam(tokens[1]);
		tempCursus.setLestijdPerWeek(Integer.parseInt(tokens[2]));
		tempCursus.setStudiePunten(Integer.parseInt(tokens[3]));

		// Invullen Opleiding
		if (tokens[4] == "boekhouding") {
			tempCursus.setOpleiding(Opleiding.boekhouding);
		} else if (tokens[4] == "informatica") {
			tempCursus.setOpleiding(Opleiding.informatica);
		} else if (tokens[4] == "marketing") {
			tempCursus.setOpleiding(Opleiding.marketing);
		}
		return tempCursus;

	}

	public void addVoorgaandeOpleidingenVanTekst(String input, Cursussen cursusContainer)
			throws CloneNotSupportedException {
		String[] tokens = input.split("\t");
		if (tokens.length > 5) {
			String[] cursusIDCollection = tokens[5].split(" ");
			for (String s : cursusIDCollection) {
				int cursusCode = Integer.parseInt(s);
				this.voorgaandeCursussen.add(cursusContainer.getCursusByCode(cursusCode));
				cursusCode = 0;
			}
		}
	}
}
